Последовательность града образуется
следующим образом:
·
Если
n четно, то делим его на 2 и присваиваем
n
·
Если
n нечетно, то умножим его на 3,
прибавим 1 и присваиваем n
Утверждается, что для любого
натурального числа n указанная
последовательность всегда заканчивается циклом: 4, 2, 1, 4, 2, 1, ...
Достаточно сказать, что при n = 1
последовательность заканчивается.
Напишите программу, которая определит
наибольшее значение в последовательности для заданного числа n.
Вход. Первая строка содержит количество
тестов t (1 ≤ t ≤ 100000). Каждый тест следует
обработать независимо от других.
Каждый тест состоит из одной строки,
содержащей два целых числа. Первое число указывает на номер теста. Вторым
является число n (1 ≤ n ≤ 100000) – начальное число
последовательности.
Выход. Для каждого теста выведите в
отдельной строке его номер, пробел, и наибольшее число, встречающееся во всей
последовательности начиная с n.
Пример
входа |
Пример
выхода |
4 1 1 2 3 3 9999 4 100000 |
1 1 2 16 3 101248 4 100000 |
рекурсия
В задаче
достаточно промоделировать вычисление функции
f(n) = ,
построив
последовательность n, f(n), f(f(n)), …, 1. Остается найти максимальное значение в этой
последовательности.
Реализуем функцию f(n).
int f(int
n)
{
if (n % 2) return 3 * n + 1;
return n / 2;
}
Основная часть программы. Читаем
входные данные.
scanf("%d",&tests);
while(tests--)
{
scanf("%d
%d",&tn,&n);
mx = 1;
Генерируем последовательность n, f(n), f(f(n)), …, 1 и находим в ней наибольшее
значение.
.
while(n >
1)
{
if (n >
mx) mx = n;
n = f(n);
}
printf("%d
%d\n",tn,mx);
}